package io.gitee.hechenl.fastiotreport.controller.converter;

import io.gitee.hechenl.fastiotreport.domain.dto.ConfigMetricUpSertDTO;
import io.gitee.hechenl.fastiotreport.domain.model.ConfigMetric;
import io.gitee.hechenl.fastiotreport.domain.model.ConfigMetricGroup;
import io.gitee.hechenl.fastiotreport.domain.vo.ConfigMetricListVO;
import io.gitee.hechenl.fastiotreport.domain.vo.ViewOptionsVO;
import io.gitee.hechenl.fastiotreport.util.ExprCalculator;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class ConfigMetricConverter {

    public static List<ConfigMetricListVO> toVOList(List<ConfigMetric> list) {
        if (CollectionUtils.isEmpty(list)) {
            return Collections.emptyList();
        }
        return list.stream().map(v -> {
            ConfigMetricListVO VO = new ConfigMetricListVO();
            VO.setId(v.getId());
            if (StringUtils.hasText(v.getMetricGroup())) {
                List<Long> groupIds = Arrays.stream(v.getMetricGroup().split(","))
                        .map(String::trim).map(Long::parseLong).collect(Collectors.toList());
                VO.setMetricGroup(groupIds);
            } else {
                VO.setMetricGroup(Collections.emptyList());
            }
            VO.setMetricName(v.getMetricName());
            VO.setMetricExpr(v.getMetricExpr());
            VO.setMetricExprComment(v.getMetricExprComment());
            return VO;
        }).collect(Collectors.toList());
    }

    public static ConfigMetric toModelList(ConfigMetricUpSertDTO dto, String comment) {
        ConfigMetric configMetric = new ConfigMetric();
        configMetric.setId(dto.getId());
        configMetric.setMetricGroup(dto.getMetricGroup().stream()
                .map(String::valueOf)
                .collect(Collectors.joining(",")));
        configMetric.setMetricName(dto.getMetricName());
        configMetric.setMetricExpr(dto.getMetricExpr());
        configMetric.setMetricExprComment(comment);
        configMetric.setMetricExprCal(ExprCalculator.getCalExpr(dto.getMetricExpr()));
        return configMetric;
    }

    public static List<ViewOptionsVO> toViewOptionsVOList(List<ConfigMetricGroup> list) {
        if (CollectionUtils.isEmpty(list)) {
            return Collections.emptyList();
        }
        return list.stream().map(v -> {
            ViewOptionsVO VO = new ViewOptionsVO();
            VO.setLabel(v.getGroupName());
            VO.setValue(v.getId());
            return VO;
        }).collect(Collectors.toList());
    }
}
